<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>11_生成器-生成器的提前结束</title>
  <!-- 
  在 JavaScript 中，生成器的提前结束是指在生成器尚未完成时，通过调用  `return()`  方法或在迭代过程中达到生成器的结束状态，来终止生成器的执行。
  1. 提前结束的方式

  生成器可以通过以下两种方式提前结束：

  - 调用  `return()`  方法：可以在生成器对象上调用  `return()`  方法，以结束生成器的执行并返回一个值。
  - 自然结束：当生成器函数执行到最后一条语句并返回时，生成器也会结束。

  2.  `return()`  方法的使用

  调用  `return(value)`  方法时：
  - 生成器会立即停止执行。
  -  `return`  方法的参数  `value`  会作为返回值的一部分，包含在返回的对象中。
  - 返回的对象的  `done`  属性将为  `true` ，表示生成器已结束。

  3. 示例代码

  以下是一个示例，展示了如何使用  `return()`  方法提前结束生成器：
  function* myGenerator() {
      yield 1;
      yield 2;
      yield 3;
      return 4; // 这个值将在生成器结束时返回
  }

  const gen = myGenerator();

  console.log(gen.next()); // 输出: { value: 1, done: false }
  console.log(gen.next()); // 输出: { value: 2, done: false }
  console.log(gen.return(10)); // 输出: { value: 10, done: true }
  console.log(gen.next()); // 输出: { value: undefined, done: true }
  4. 注意事项
  - 清理资源：在  `return()`  方法中，可以执行一些清理操作，例如关闭文件、清理网络请求等。
  - 后续调用：在调用  `return()`  方法后，任何对生成器的后续调用（如  `next()` ）将返回  `{ value: undefined, done: true }` ，表示生成器已经结束。

  5. 总结
  生成器的提前结束机制通过  `return()`  方法使得开发者能够灵活地控制生成器的执行流程。它不仅可以用于结束生成器，还可以返回特定的值，并执行必要的清理工作。这种机制在处理复杂的迭代逻辑和资源管理时非常有用。
  -->
</head>
<body>

  <script>
    function* foo(name) {
      console.log('111', name);
      console.log('111', name);
      const name1 =  yield "yield-1";
      console.log('222', name, name1);
      console.log('222', name, name1);
      const name2 =  yield "yield-2";
      console.log('333', name, name2);
      console.log('333', name, name2);
      const name3 = yield "yield-3";
      console.log('444', name, name3);
      console.log('444', name, name3);
      return undefined;
    }

    const generator = foo('generator');
    // 1.generator.return提前结束函数
    console.log(generator.next(1));
    console.log(generator.return('return-1'));
    console.log("----------------");
    console.log(generator.next(2));
    console.log(generator.next(3));
    
    // 2. generator.throw抛出异常，终止函数
    // console.log(generator.next(1));
    // console.log(generator.throw('throw-1'));
    // console.log("----------------");
    // console.log(generator.next(2));
    // console.log(generator.next(3));
    
    


  </script>
  
</body>
</html>